package 每日一题;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 会玩的洋洋
 * https://leetcode-cn.com/problems/count-number-of-pairs-with-absolute-difference-k/
 */
public class _2006_差的绝对值为K的数对数目 {
    public static void main(String[] args) {
        int[] num = new int[] {
                3,2,1,5,4
        };
//        countKDifference(num, 2);
    }

    /**
     * 暴力解法 简单
     * @param nums 目标数组
     * @param k 目标对应值 K
     * @return int
     */
    public int countKDifference1(int[] nums, int k) {
        int n = nums.length;
        int ans = 0;
        for (int i = 0; i < n; i++) {
            int target = nums[i];
            for (int j = i + 1; j < n; j++) {
                if (Math.abs(target - nums[j]) == k) {
                    ans++;
                }
            }
        }
        return ans;
    }

    /**
     * 哈希表  通过 HashMap 来存储 key 作为 nums 的值  value 存 相同值的数量
     * @param nums 目标数组
     * @param k 目标值
     * @return int
     */
    public int countKDifference(int[] nums, int k) {
        Map<Integer, Integer> hash = new HashMap<>();
        int ans = 0;
        for (int num : nums) {
            ans += hash.getOrDefault(num - k, 0) + hash.getOrDefault(num + k, 0);
            hash.put(num, hash.getOrDefault(num, 0) + 1);
        }
        return ans;
    }

    /**
     * 计数
     * @param nums 目标数组
     * @param k 目标值
     * @return int
     */
    public int countKDifference2(int[] nums, int k) {
        int ret = 0;
        int[] arr = new int[101];
        for (int num : nums) {
            arr[num]++;
        }
        for (int i = 0; i < arr.length - k; i++) {
            ret += arr[i] * arr[i + k];
        }
        return ret;
    }
}
